{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "Using TensorFlow backend.\n"
     ]
    }
   ],
   "source": [
    "import keras\n",
    "import tensorflow as tf\n",
    "import numpy as np\n",
    "import csv\n",
    "import pandas as pd\n",
    "import datetime as dt\n",
    "import matplotlib.pyplot as plt\n",
    "%matplotlib inline\n",
    "\n",
    "import math\n",
    "from keras.models import Sequential\n",
    "from keras.layers import Dense\n",
    "from keras.layers import LSTM\n",
    "from sklearn.preprocessing import MinMaxScaler\n",
    "from sklearn.metrics import mean_squared_error"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "metadata": {},
   "outputs": [],
   "source": [
    "def get_input_data(lstm_input):    \n",
    "    lstm_input['date'] = pd.to_datetime(lstm_input['date'])\n",
    "    \n",
    "    # Assigning Binary variables for each day\n",
    "    lstm_input['WeekOfDay'] = lstm_input['date'].dt.day_name()\n",
    "    lstm_input.loc[lstm_input['WeekOfDay'].str.contains('Monday'), 'Mon'] = 1\n",
    "    lstm_input.loc[lstm_input['WeekOfDay'].str.contains('Tuesday'), 'Tue'] = 1\n",
    "    lstm_input.loc[lstm_input['WeekOfDay'].str.contains('Wednesday'), 'Wed'] = 1\n",
    "    lstm_input.loc[lstm_input['WeekOfDay'].str.contains('Thursday'), 'Thr'] = 1\n",
    "    lstm_input.loc[lstm_input['WeekOfDay'].str.contains('Friday'), 'Fri'] = 1\n",
    "    lstm_input.loc[lstm_input['WeekOfDay'].str.contains('Saturday'), 'Sat'] = 1\n",
    "    lstm_input.loc[lstm_input['WeekOfDay'].str.contains('Sunday'), 'Sun'] = 1\n",
    "    lstm_input = lstm_input.drop(['WeekOfDay'], axis=1)\n",
    "    lstm_input = lstm_input.fillna(0)\n",
    "    \n",
    "    # Rearrange the order of columns\n",
    "    cols = ['date', 'Mon', 'Tue', 'Wed', 'Thr', 'Fri', 'Sun', 'X','Y']\n",
    "    lstm_input = lstm_input[cols]\n",
    "    lstm_input = lstm_input.set_index('date')\n",
    "    \n",
    "    return lstm_input"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "metadata": {},
   "outputs": [],
   "source": [
    "def convert_input_structure(proportion, LSTM_Train):\n",
    "    # Split training, validation, and test dataset\n",
    "    dataset1 = LSTM_Train.values\n",
    "    dataset1 = dataset1.astype('float32')\n",
    "    \n",
    "    # To obtain the validation data\n",
    "    train_proportion = proportion\n",
    "    \n",
    "    # Split train set and test set\n",
    "    train = dataset1[:train_proportion, :]\n",
    "    valid = dataset1[train_proportion:, :]\n",
    "    \n",
    "    # split the dataset as train, validation, and test\n",
    "    train_X, train_y = train[:, :-1], train[:, -1]\n",
    "    valid_X, valid_y = valid[:, :-1], valid[:, -1]\n",
    "    \n",
    "    # reshape input to be 3-D [samples, timesteps, features]\n",
    "    train_X = train_X.reshape((train_X.shape[0], 1, train_X.shape[1]))\n",
    "    valid_X = valid_X.reshape((valid_X.shape[0], 1, valid_X.shape[1]))\n",
    "\n",
    "    return train_X, train_y, valid_X, valid_y\n",
    "\n",
    "def convert_test_structure(LSTM_Test):\n",
    "    # Split training, validation, and test dataset\n",
    "    dataset2 = LSTM_Test.values\n",
    "    dataset2 = dataset2.astype('float32')\n",
    "    \n",
    "    test_X, test_y = dataset2[:, :-1], dataset2[:, -1]\n",
    "    test_X = test_X.reshape(((test_X.shape[0], 1, test_X.shape[1])))\n",
    "\n",
    "    return test_X, test_y"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "metadata": {},
   "outputs": [],
   "source": [
    "def build_LSTM_structure(conv_data):\n",
    "    # design network\n",
    "    model = Sequential()\n",
    "    # Two-layered LSTM\n",
    "    model.add(LSTM(10, return_sequences=True, input_shape=(conv_data[0].shape[1], conv_data[0].shape[2])))\n",
    "    model.add(LSTM(10))\n",
    "    # Activation function is defined as a linear formula\n",
    "    model.add(Dense(1, activation='linear'))\n",
    "    model.compile(loss='mse', optimizer='adam')\n",
    "\n",
    "    # fit network\n",
    "    history = model.fit(conv_data[0], conv_data[1], epochs=500, batch_size = 10, validation_data=(conv_data[2], conv_data[3]), verbose=2, shuffle=False)\n",
    "    \n",
    "    return model, history"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "metadata": {
    "scrolled": true
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Train on 800 samples, validate on 130 samples\n",
      "Epoch 1/500\n",
      " - 1s - loss: 0.0097 - val_loss: 0.0095\n",
      "Epoch 2/500\n",
      " - 0s - loss: 0.0093 - val_loss: 0.0087\n",
      "Epoch 3/500\n",
      " - 0s - loss: 0.0085 - val_loss: 0.0074\n",
      "Epoch 4/500\n",
      " - 0s - loss: 0.0074 - val_loss: 0.0063\n",
      "Epoch 5/500\n",
      " - 0s - loss: 0.0064 - val_loss: 0.0059\n",
      "Epoch 6/500\n",
      " - 0s - loss: 0.0059 - val_loss: 0.0060\n",
      "Epoch 7/500\n",
      " - 0s - loss: 0.0058 - val_loss: 0.0061\n",
      "Epoch 8/500\n",
      " - 0s - loss: 0.0058 - val_loss: 0.0061\n",
      "Epoch 9/500\n",
      " - 0s - loss: 0.0058 - val_loss: 0.0061\n",
      "Epoch 10/500\n",
      " - 0s - loss: 0.0058 - val_loss: 0.0061\n",
      "Epoch 11/500\n",
      " - 0s - loss: 0.0058 - val_loss: 0.0061\n",
      "Epoch 12/500\n",
      " - 0s - loss: 0.0058 - val_loss: 0.0061\n",
      "Epoch 13/500\n",
      " - 0s - loss: 0.0058 - val_loss: 0.0061\n",
      "Epoch 14/500\n",
      " - 0s - loss: 0.0058 - val_loss: 0.0061\n",
      "Epoch 15/500\n",
      " - 0s - loss: 0.0058 - val_loss: 0.0061\n",
      "Epoch 16/500\n",
      " - 0s - loss: 0.0058 - val_loss: 0.0061\n",
      "Epoch 17/500\n",
      " - 0s - loss: 0.0058 - val_loss: 0.0061\n",
      "Epoch 18/500\n",
      " - 0s - loss: 0.0058 - val_loss: 0.0061\n",
      "Epoch 19/500\n",
      " - 0s - loss: 0.0058 - val_loss: 0.0061\n",
      "Epoch 20/500\n",
      " - 0s - loss: 0.0058 - val_loss: 0.0061\n",
      "Epoch 21/500\n",
      " - 0s - loss: 0.0058 - val_loss: 0.0061\n",
      "Epoch 22/500\n",
      " - 0s - loss: 0.0058 - val_loss: 0.0061\n",
      "Epoch 23/500\n",
      " - 0s - loss: 0.0058 - val_loss: 0.0061\n",
      "Epoch 24/500\n",
      " - 0s - loss: 0.0057 - val_loss: 0.0061\n",
      "Epoch 25/500\n",
      " - 0s - loss: 0.0057 - val_loss: 0.0061\n",
      "Epoch 26/500\n",
      " - 0s - loss: 0.0057 - val_loss: 0.0061\n",
      "Epoch 27/500\n",
      " - 0s - loss: 0.0057 - val_loss: 0.0061\n",
      "Epoch 28/500\n",
      " - 0s - loss: 0.0057 - val_loss: 0.0061\n",
      "Epoch 29/500\n",
      " - 0s - loss: 0.0057 - val_loss: 0.0061\n",
      "Epoch 30/500\n",
      " - 0s - loss: 0.0057 - val_loss: 0.0061\n",
      "Epoch 31/500\n",
      " - 0s - loss: 0.0057 - val_loss: 0.0061\n",
      "Epoch 32/500\n",
      " - 0s - loss: 0.0057 - val_loss: 0.0061\n",
      "Epoch 33/500\n",
      " - 0s - loss: 0.0057 - val_loss: 0.0061\n",
      "Epoch 34/500\n",
      " - 0s - loss: 0.0057 - val_loss: 0.0061\n",
      "Epoch 35/500\n",
      " - 0s - loss: 0.0057 - val_loss: 0.0061\n",
      "Epoch 36/500\n",
      " - 0s - loss: 0.0057 - val_loss: 0.0061\n",
      "Epoch 37/500\n",
      " - 0s - loss: 0.0057 - val_loss: 0.0061\n",
      "Epoch 38/500\n",
      " - 0s - loss: 0.0057 - val_loss: 0.0061\n",
      "Epoch 39/500\n",
      " - 0s - loss: 0.0057 - val_loss: 0.0061\n",
      "Epoch 40/500\n",
      " - 0s - loss: 0.0057 - val_loss: 0.0061\n",
      "Epoch 41/500\n",
      " - 0s - loss: 0.0057 - val_loss: 0.0061\n",
      "Epoch 42/500\n",
      " - 0s - loss: 0.0057 - val_loss: 0.0061\n",
      "Epoch 43/500\n",
      " - 0s - loss: 0.0057 - val_loss: 0.0061\n",
      "Epoch 44/500\n",
      " - 0s - loss: 0.0057 - val_loss: 0.0061\n",
      "Epoch 45/500\n",
      " - 0s - loss: 0.0057 - val_loss: 0.0061\n",
      "Epoch 46/500\n",
      " - 0s - loss: 0.0057 - val_loss: 0.0061\n",
      "Epoch 47/500\n",
      " - 0s - loss: 0.0057 - val_loss: 0.0061\n",
      "Epoch 48/500\n",
      " - 0s - loss: 0.0057 - val_loss: 0.0061\n",
      "Epoch 49/500\n",
      " - 0s - loss: 0.0057 - val_loss: 0.0061\n",
      "Epoch 50/500\n",
      " - 0s - loss: 0.0057 - val_loss: 0.0061\n",
      "Epoch 51/500\n",
      " - 0s - loss: 0.0057 - val_loss: 0.0061\n",
      "Epoch 52/500\n",
      " - 0s - loss: 0.0057 - val_loss: 0.0061\n",
      "Epoch 53/500\n",
      " - 0s - loss: 0.0057 - val_loss: 0.0061\n",
      "Epoch 54/500\n",
      " - 0s - loss: 0.0057 - val_loss: 0.0061\n",
      "Epoch 55/500\n",
      " - 0s - loss: 0.0057 - val_loss: 0.0061\n",
      "Epoch 56/500\n",
      " - 0s - loss: 0.0057 - val_loss: 0.0061\n",
      "Epoch 57/500\n",
      " - 0s - loss: 0.0057 - val_loss: 0.0061\n",
      "Epoch 58/500\n",
      " - 0s - loss: 0.0057 - val_loss: 0.0061\n",
      "Epoch 59/500\n",
      " - 0s - loss: 0.0057 - val_loss: 0.0061\n",
      "Epoch 60/500\n",
      " - 0s - loss: 0.0057 - val_loss: 0.0061\n",
      "Epoch 61/500\n",
      " - 0s - loss: 0.0057 - val_loss: 0.0061\n",
      "Epoch 62/500\n",
      " - 0s - loss: 0.0057 - val_loss: 0.0061\n",
      "Epoch 63/500\n",
      " - 0s - loss: 0.0057 - val_loss: 0.0061\n",
      "Epoch 64/500\n",
      " - 0s - loss: 0.0057 - val_loss: 0.0061\n",
      "Epoch 65/500\n",
      " - 0s - loss: 0.0057 - val_loss: 0.0061\n",
      "Epoch 66/500\n",
      " - 0s - loss: 0.0057 - val_loss: 0.0061\n",
      "Epoch 67/500\n",
      " - 0s - loss: 0.0057 - val_loss: 0.0061\n",
      "Epoch 68/500\n",
      " - 0s - loss: 0.0057 - val_loss: 0.0061\n",
      "Epoch 69/500\n",
      " - 0s - loss: 0.0057 - val_loss: 0.0061\n",
      "Epoch 70/500\n",
      " - 0s - loss: 0.0057 - val_loss: 0.0061\n",
      "Epoch 71/500\n",
      " - 0s - loss: 0.0057 - val_loss: 0.0061\n",
      "Epoch 72/500\n",
      " - 0s - loss: 0.0057 - val_loss: 0.0061\n",
      "Epoch 73/500\n",
      " - 0s - loss: 0.0057 - val_loss: 0.0061\n",
      "Epoch 74/500\n",
      " - 0s - loss: 0.0057 - val_loss: 0.0061\n",
      "Epoch 75/500\n",
      " - 0s - loss: 0.0057 - val_loss: 0.0061\n",
      "Epoch 76/500\n",
      " - 0s - loss: 0.0057 - val_loss: 0.0061\n",
      "Epoch 77/500\n",
      " - 0s - loss: 0.0057 - val_loss: 0.0061\n",
      "Epoch 78/500\n",
      " - 0s - loss: 0.0057 - val_loss: 0.0061\n",
      "Epoch 79/500\n",
      " - 0s - loss: 0.0057 - val_loss: 0.0061\n",
      "Epoch 80/500\n",
      " - 0s - loss: 0.0057 - val_loss: 0.0061\n",
      "Epoch 81/500\n",
      " - 0s - loss: 0.0057 - val_loss: 0.0061\n",
      "Epoch 82/500\n",
      " - 0s - loss: 0.0057 - val_loss: 0.0061\n",
      "Epoch 83/500\n",
      " - 0s - loss: 0.0057 - val_loss: 0.0061\n",
      "Epoch 84/500\n",
      " - 0s - loss: 0.0057 - val_loss: 0.0061\n",
      "Epoch 85/500\n",
      " - 0s - loss: 0.0057 - val_loss: 0.0061\n",
      "Epoch 86/500\n",
      " - 0s - loss: 0.0057 - val_loss: 0.0061\n",
      "Epoch 87/500\n",
      " - 0s - loss: 0.0057 - val_loss: 0.0061\n",
      "Epoch 88/500\n",
      " - 0s - loss: 0.0057 - val_loss: 0.0061\n",
      "Epoch 89/500\n",
      " - 0s - loss: 0.0057 - val_loss: 0.0061\n",
      "Epoch 90/500\n",
      " - 0s - loss: 0.0057 - val_loss: 0.0061\n",
      "Epoch 91/500\n",
      " - 0s - loss: 0.0057 - val_loss: 0.0061\n",
      "Epoch 92/500\n",
      " - 0s - loss: 0.0057 - val_loss: 0.0061\n",
      "Epoch 93/500\n",
      " - 0s - loss: 0.0057 - val_loss: 0.0061\n",
      "Epoch 94/500\n",
      " - 0s - loss: 0.0057 - val_loss: 0.0061\n",
      "Epoch 95/500\n",
      " - 0s - loss: 0.0057 - val_loss: 0.0061\n",
      "Epoch 96/500\n",
      " - 0s - loss: 0.0057 - val_loss: 0.0061\n",
      "Epoch 97/500\n",
      " - 0s - loss: 0.0057 - val_loss: 0.0061\n",
      "Epoch 98/500\n",
      " - 0s - loss: 0.0057 - val_loss: 0.0061\n",
      "Epoch 99/500\n",
      " - 0s - loss: 0.0057 - val_loss: 0.0061\n",
      "Epoch 100/500\n",
      " - 0s - loss: 0.0057 - val_loss: 0.0061\n",
      "Epoch 101/500\n",
      " - 0s - loss: 0.0057 - val_loss: 0.0061\n",
      "Epoch 102/500\n",
      " - 0s - loss: 0.0057 - val_loss: 0.0061\n",
      "Epoch 103/500\n",
      " - 0s - loss: 0.0057 - val_loss: 0.0061\n",
      "Epoch 104/500\n",
      " - 0s - loss: 0.0057 - val_loss: 0.0061\n",
      "Epoch 105/500\n",
      " - 0s - loss: 0.0057 - val_loss: 0.0061\n",
      "Epoch 106/500\n",
      " - 0s - loss: 0.0057 - val_loss: 0.0061\n",
      "Epoch 107/500\n",
      " - 0s - loss: 0.0057 - val_loss: 0.0061\n",
      "Epoch 108/500\n",
      " - 0s - loss: 0.0057 - val_loss: 0.0061\n",
      "Epoch 109/500\n",
      " - 0s - loss: 0.0057 - val_loss: 0.0061\n",
      "Epoch 110/500\n",
      " - 0s - loss: 0.0057 - val_loss: 0.0061\n",
      "Epoch 111/500\n",
      " - 0s - loss: 0.0057 - val_loss: 0.0061\n",
      "Epoch 112/500\n",
      " - 0s - loss: 0.0057 - val_loss: 0.0061\n",
      "Epoch 113/500\n",
      " - 0s - loss: 0.0057 - val_loss: 0.0061\n",
      "Epoch 114/500\n",
      " - 0s - loss: 0.0057 - val_loss: 0.0061\n",
      "Epoch 115/500\n",
      " - 0s - loss: 0.0057 - val_loss: 0.0061\n",
      "Epoch 116/500\n",
      " - 0s - loss: 0.0057 - val_loss: 0.0061\n",
      "Epoch 117/500\n",
      " - 0s - loss: 0.0057 - val_loss: 0.0061\n",
      "Epoch 118/500\n",
      " - 0s - loss: 0.0057 - val_loss: 0.0061\n",
      "Epoch 119/500\n",
      " - 0s - loss: 0.0057 - val_loss: 0.0061\n",
      "Epoch 120/500\n",
      " - 0s - loss: 0.0057 - val_loss: 0.0061\n",
      "Epoch 121/500\n",
      " - 0s - loss: 0.0057 - val_loss: 0.0061\n",
      "Epoch 122/500\n",
      " - 0s - loss: 0.0057 - val_loss: 0.0061\n",
      "Epoch 123/500\n",
      " - 0s - loss: 0.0057 - val_loss: 0.0061\n",
      "Epoch 124/500\n",
      " - 0s - loss: 0.0057 - val_loss: 0.0061\n",
      "Epoch 125/500\n",
      " - 0s - loss: 0.0057 - val_loss: 0.0061\n",
      "Epoch 126/500\n",
      " - 0s - loss: 0.0057 - val_loss: 0.0061\n",
      "Epoch 127/500\n",
      " - 0s - loss: 0.0057 - val_loss: 0.0061\n",
      "Epoch 128/500\n",
      " - 0s - loss: 0.0057 - val_loss: 0.0061\n",
      "Epoch 129/500\n",
      " - 0s - loss: 0.0057 - val_loss: 0.0061\n",
      "Epoch 130/500\n",
      " - 0s - loss: 0.0057 - val_loss: 0.0061\n",
      "Epoch 131/500\n",
      " - 0s - loss: 0.0057 - val_loss: 0.0061\n",
      "Epoch 132/500\n",
      " - 0s - loss: 0.0057 - val_loss: 0.0061\n",
      "Epoch 133/500\n",
      " - 0s - loss: 0.0057 - val_loss: 0.0061\n",
      "Epoch 134/500\n",
      " - 0s - loss: 0.0057 - val_loss: 0.0061\n",
      "Epoch 135/500\n",
      " - 0s - loss: 0.0057 - val_loss: 0.0061\n",
      "Epoch 136/500\n",
      " - 0s - loss: 0.0057 - val_loss: 0.0061\n",
      "Epoch 137/500\n",
      " - 0s - loss: 0.0057 - val_loss: 0.0061\n",
      "Epoch 138/500\n",
      " - 0s - loss: 0.0057 - val_loss: 0.0061\n",
      "Epoch 139/500\n",
      " - 0s - loss: 0.0057 - val_loss: 0.0061\n",
      "Epoch 140/500\n",
      " - 0s - loss: 0.0057 - val_loss: 0.0061\n",
      "Epoch 141/500\n",
      " - 0s - loss: 0.0057 - val_loss: 0.0061\n",
      "Epoch 142/500\n",
      " - 0s - loss: 0.0057 - val_loss: 0.0061\n",
      "Epoch 143/500\n",
      " - 0s - loss: 0.0057 - val_loss: 0.0061\n",
      "Epoch 144/500\n",
      " - 0s - loss: 0.0057 - val_loss: 0.0061\n",
      "Epoch 145/500\n",
      " - 0s - loss: 0.0057 - val_loss: 0.0061\n",
      "Epoch 146/500\n",
      " - 0s - loss: 0.0057 - val_loss: 0.0061\n",
      "Epoch 147/500\n",
      " - 0s - loss: 0.0056 - val_loss: 0.0061\n",
      "Epoch 148/500\n",
      " - 0s - loss: 0.0056 - val_loss: 0.0061\n",
      "Epoch 149/500\n",
      " - 0s - loss: 0.0056 - val_loss: 0.0061\n",
      "Epoch 150/500\n",
      " - 0s - loss: 0.0056 - val_loss: 0.0061\n",
      "Epoch 151/500\n",
      " - 0s - loss: 0.0056 - val_loss: 0.0061\n",
      "Epoch 152/500\n",
      " - 0s - loss: 0.0056 - val_loss: 0.0061\n",
      "Epoch 153/500\n",
      " - 0s - loss: 0.0056 - val_loss: 0.0061\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Epoch 154/500\n",
      " - 0s - loss: 0.0056 - val_loss: 0.0061\n",
      "Epoch 155/500\n",
      " - 0s - loss: 0.0056 - val_loss: 0.0061\n",
      "Epoch 156/500\n",
      " - 0s - loss: 0.0056 - val_loss: 0.0061\n",
      "Epoch 157/500\n",
      " - 0s - loss: 0.0056 - val_loss: 0.0061\n",
      "Epoch 158/500\n",
      " - 0s - loss: 0.0056 - val_loss: 0.0061\n",
      "Epoch 159/500\n",
      " - 0s - loss: 0.0056 - val_loss: 0.0061\n",
      "Epoch 160/500\n",
      " - 0s - loss: 0.0056 - val_loss: 0.0061\n",
      "Epoch 161/500\n",
      " - 0s - loss: 0.0056 - val_loss: 0.0061\n",
      "Epoch 162/500\n",
      " - 0s - loss: 0.0056 - val_loss: 0.0061\n",
      "Epoch 163/500\n",
      " - 0s - loss: 0.0056 - val_loss: 0.0061\n",
      "Epoch 164/500\n",
      " - 0s - loss: 0.0056 - val_loss: 0.0061\n",
      "Epoch 165/500\n",
      " - 0s - loss: 0.0056 - val_loss: 0.0061\n",
      "Epoch 166/500\n",
      " - 0s - loss: 0.0056 - val_loss: 0.0061\n",
      "Epoch 167/500\n",
      " - 0s - loss: 0.0056 - val_loss: 0.0061\n",
      "Epoch 168/500\n",
      " - 0s - loss: 0.0056 - val_loss: 0.0061\n",
      "Epoch 169/500\n",
      " - 0s - loss: 0.0056 - val_loss: 0.0061\n",
      "Epoch 170/500\n",
      " - 0s - loss: 0.0056 - val_loss: 0.0061\n",
      "Epoch 171/500\n",
      " - 0s - loss: 0.0056 - val_loss: 0.0061\n",
      "Epoch 172/500\n",
      " - 0s - loss: 0.0056 - val_loss: 0.0061\n",
      "Epoch 173/500\n",
      " - 0s - loss: 0.0056 - val_loss: 0.0061\n",
      "Epoch 174/500\n",
      " - 0s - loss: 0.0056 - val_loss: 0.0061\n",
      "Epoch 175/500\n",
      " - 0s - loss: 0.0056 - val_loss: 0.0061\n",
      "Epoch 176/500\n",
      " - 0s - loss: 0.0056 - val_loss: 0.0061\n",
      "Epoch 177/500\n",
      " - 0s - loss: 0.0056 - val_loss: 0.0061\n",
      "Epoch 178/500\n",
      " - 0s - loss: 0.0056 - val_loss: 0.0061\n",
      "Epoch 179/500\n",
      " - 0s - loss: 0.0056 - val_loss: 0.0061\n",
      "Epoch 180/500\n",
      " - 0s - loss: 0.0056 - val_loss: 0.0061\n",
      "Epoch 181/500\n",
      " - 0s - loss: 0.0056 - val_loss: 0.0061\n",
      "Epoch 182/500\n",
      " - 0s - loss: 0.0056 - val_loss: 0.0061\n",
      "Epoch 183/500\n",
      " - 0s - loss: 0.0056 - val_loss: 0.0061\n",
      "Epoch 184/500\n",
      " - 0s - loss: 0.0056 - val_loss: 0.0061\n",
      "Epoch 185/500\n",
      " - 0s - loss: 0.0056 - val_loss: 0.0061\n",
      "Epoch 186/500\n",
      " - 0s - loss: 0.0056 - val_loss: 0.0061\n",
      "Epoch 187/500\n",
      " - 0s - loss: 0.0056 - val_loss: 0.0061\n",
      "Epoch 188/500\n",
      " - 0s - loss: 0.0056 - val_loss: 0.0061\n",
      "Epoch 189/500\n",
      " - 0s - loss: 0.0056 - val_loss: 0.0061\n",
      "Epoch 190/500\n",
      " - 0s - loss: 0.0056 - val_loss: 0.0061\n",
      "Epoch 191/500\n",
      " - 0s - loss: 0.0056 - val_loss: 0.0061\n",
      "Epoch 192/500\n",
      " - 0s - loss: 0.0056 - val_loss: 0.0061\n",
      "Epoch 193/500\n",
      " - 0s - loss: 0.0056 - val_loss: 0.0061\n",
      "Epoch 194/500\n",
      " - 0s - loss: 0.0056 - val_loss: 0.0061\n",
      "Epoch 195/500\n",
      " - 0s - loss: 0.0056 - val_loss: 0.0061\n",
      "Epoch 196/500\n",
      " - 0s - loss: 0.0056 - val_loss: 0.0061\n",
      "Epoch 197/500\n",
      " - 0s - loss: 0.0056 - val_loss: 0.0061\n",
      "Epoch 198/500\n",
      " - 0s - loss: 0.0056 - val_loss: 0.0061\n",
      "Epoch 199/500\n",
      " - 0s - loss: 0.0056 - val_loss: 0.0061\n",
      "Epoch 200/500\n",
      " - 0s - loss: 0.0056 - val_loss: 0.0061\n",
      "Epoch 201/500\n",
      " - 0s - loss: 0.0056 - val_loss: 0.0061\n",
      "Epoch 202/500\n",
      " - 0s - loss: 0.0056 - val_loss: 0.0061\n",
      "Epoch 203/500\n",
      " - 0s - loss: 0.0056 - val_loss: 0.0061\n",
      "Epoch 204/500\n",
      " - 0s - loss: 0.0056 - val_loss: 0.0061\n",
      "Epoch 205/500\n",
      " - 0s - loss: 0.0056 - val_loss: 0.0061\n",
      "Epoch 206/500\n",
      " - 0s - loss: 0.0056 - val_loss: 0.0061\n",
      "Epoch 207/500\n",
      " - 0s - loss: 0.0056 - val_loss: 0.0061\n",
      "Epoch 208/500\n",
      " - 0s - loss: 0.0056 - val_loss: 0.0061\n",
      "Epoch 209/500\n",
      " - 0s - loss: 0.0056 - val_loss: 0.0061\n",
      "Epoch 210/500\n",
      " - 0s - loss: 0.0056 - val_loss: 0.0061\n",
      "Epoch 211/500\n",
      " - 0s - loss: 0.0056 - val_loss: 0.0061\n",
      "Epoch 212/500\n",
      " - 0s - loss: 0.0056 - val_loss: 0.0061\n",
      "Epoch 213/500\n",
      " - 0s - loss: 0.0055 - val_loss: 0.0061\n",
      "Epoch 214/500\n",
      " - 0s - loss: 0.0055 - val_loss: 0.0061\n",
      "Epoch 215/500\n",
      " - 0s - loss: 0.0055 - val_loss: 0.0061\n",
      "Epoch 216/500\n",
      " - 0s - loss: 0.0055 - val_loss: 0.0061\n",
      "Epoch 217/500\n",
      " - 0s - loss: 0.0055 - val_loss: 0.0061\n",
      "Epoch 218/500\n",
      " - 0s - loss: 0.0055 - val_loss: 0.0061\n",
      "Epoch 219/500\n",
      " - 0s - loss: 0.0055 - val_loss: 0.0061\n",
      "Epoch 220/500\n",
      " - 0s - loss: 0.0055 - val_loss: 0.0061\n",
      "Epoch 221/500\n",
      " - 0s - loss: 0.0055 - val_loss: 0.0061\n",
      "Epoch 222/500\n",
      " - 0s - loss: 0.0055 - val_loss: 0.0061\n",
      "Epoch 223/500\n",
      " - 0s - loss: 0.0055 - val_loss: 0.0061\n",
      "Epoch 224/500\n",
      " - 0s - loss: 0.0055 - val_loss: 0.0061\n",
      "Epoch 225/500\n",
      " - 0s - loss: 0.0055 - val_loss: 0.0061\n",
      "Epoch 226/500\n",
      " - 0s - loss: 0.0055 - val_loss: 0.0061\n",
      "Epoch 227/500\n",
      " - 0s - loss: 0.0055 - val_loss: 0.0061\n",
      "Epoch 228/500\n",
      " - 0s - loss: 0.0055 - val_loss: 0.0061\n",
      "Epoch 229/500\n",
      " - 0s - loss: 0.0055 - val_loss: 0.0061\n",
      "Epoch 230/500\n",
      " - 0s - loss: 0.0055 - val_loss: 0.0061\n",
      "Epoch 231/500\n",
      " - 0s - loss: 0.0055 - val_loss: 0.0061\n",
      "Epoch 232/500\n",
      " - 0s - loss: 0.0055 - val_loss: 0.0061\n",
      "Epoch 233/500\n",
      " - 0s - loss: 0.0055 - val_loss: 0.0061\n",
      "Epoch 234/500\n",
      " - 0s - loss: 0.0055 - val_loss: 0.0061\n",
      "Epoch 235/500\n",
      " - 0s - loss: 0.0055 - val_loss: 0.0061\n",
      "Epoch 236/500\n",
      " - 0s - loss: 0.0055 - val_loss: 0.0061\n",
      "Epoch 237/500\n",
      " - 0s - loss: 0.0055 - val_loss: 0.0061\n",
      "Epoch 238/500\n",
      " - 0s - loss: 0.0055 - val_loss: 0.0061\n",
      "Epoch 239/500\n",
      " - 0s - loss: 0.0055 - val_loss: 0.0061\n",
      "Epoch 240/500\n",
      " - 0s - loss: 0.0055 - val_loss: 0.0061\n",
      "Epoch 241/500\n",
      " - 0s - loss: 0.0055 - val_loss: 0.0061\n",
      "Epoch 242/500\n",
      " - 0s - loss: 0.0055 - val_loss: 0.0061\n",
      "Epoch 243/500\n",
      " - 0s - loss: 0.0055 - val_loss: 0.0061\n",
      "Epoch 244/500\n",
      " - 0s - loss: 0.0055 - val_loss: 0.0061\n",
      "Epoch 245/500\n",
      " - 0s - loss: 0.0055 - val_loss: 0.0061\n",
      "Epoch 246/500\n",
      " - 0s - loss: 0.0055 - val_loss: 0.0061\n",
      "Epoch 247/500\n",
      " - 0s - loss: 0.0055 - val_loss: 0.0061\n",
      "Epoch 248/500\n",
      " - 0s - loss: 0.0055 - val_loss: 0.0061\n",
      "Epoch 249/500\n",
      " - 0s - loss: 0.0055 - val_loss: 0.0061\n",
      "Epoch 250/500\n",
      " - 0s - loss: 0.0055 - val_loss: 0.0061\n",
      "Epoch 251/500\n",
      " - 0s - loss: 0.0055 - val_loss: 0.0061\n",
      "Epoch 252/500\n",
      " - 0s - loss: 0.0055 - val_loss: 0.0061\n",
      "Epoch 253/500\n",
      " - 0s - loss: 0.0055 - val_loss: 0.0061\n",
      "Epoch 254/500\n",
      " - 0s - loss: 0.0055 - val_loss: 0.0061\n",
      "Epoch 255/500\n",
      " - 0s - loss: 0.0055 - val_loss: 0.0061\n",
      "Epoch 256/500\n",
      " - 0s - loss: 0.0055 - val_loss: 0.0061\n",
      "Epoch 257/500\n",
      " - 0s - loss: 0.0055 - val_loss: 0.0061\n",
      "Epoch 258/500\n",
      " - 0s - loss: 0.0055 - val_loss: 0.0061\n",
      "Epoch 259/500\n",
      " - 0s - loss: 0.0055 - val_loss: 0.0061\n",
      "Epoch 260/500\n",
      " - 0s - loss: 0.0055 - val_loss: 0.0061\n",
      "Epoch 261/500\n",
      " - 0s - loss: 0.0055 - val_loss: 0.0061\n",
      "Epoch 262/500\n",
      " - 0s - loss: 0.0055 - val_loss: 0.0061\n",
      "Epoch 263/500\n",
      " - 0s - loss: 0.0055 - val_loss: 0.0061\n",
      "Epoch 264/500\n",
      " - 0s - loss: 0.0055 - val_loss: 0.0061\n",
      "Epoch 265/500\n",
      " - 0s - loss: 0.0055 - val_loss: 0.0061\n",
      "Epoch 266/500\n",
      " - 0s - loss: 0.0055 - val_loss: 0.0061\n",
      "Epoch 267/500\n",
      " - 0s - loss: 0.0055 - val_loss: 0.0061\n",
      "Epoch 268/500\n",
      " - 0s - loss: 0.0055 - val_loss: 0.0061\n",
      "Epoch 269/500\n",
      " - 0s - loss: 0.0055 - val_loss: 0.0061\n",
      "Epoch 270/500\n",
      " - 0s - loss: 0.0055 - val_loss: 0.0060\n",
      "Epoch 271/500\n",
      " - 0s - loss: 0.0055 - val_loss: 0.0060\n",
      "Epoch 272/500\n",
      " - 0s - loss: 0.0055 - val_loss: 0.0060\n",
      "Epoch 273/500\n",
      " - 0s - loss: 0.0055 - val_loss: 0.0060\n",
      "Epoch 274/500\n",
      " - 0s - loss: 0.0055 - val_loss: 0.0060\n",
      "Epoch 275/500\n",
      " - 0s - loss: 0.0055 - val_loss: 0.0060\n",
      "Epoch 276/500\n",
      " - 0s - loss: 0.0055 - val_loss: 0.0060\n",
      "Epoch 277/500\n",
      " - 0s - loss: 0.0055 - val_loss: 0.0060\n",
      "Epoch 278/500\n",
      " - 0s - loss: 0.0055 - val_loss: 0.0060\n",
      "Epoch 279/500\n",
      " - 0s - loss: 0.0055 - val_loss: 0.0060\n",
      "Epoch 280/500\n",
      " - 0s - loss: 0.0055 - val_loss: 0.0060\n",
      "Epoch 281/500\n",
      " - 0s - loss: 0.0055 - val_loss: 0.0060\n",
      "Epoch 282/500\n",
      " - 0s - loss: 0.0055 - val_loss: 0.0060\n",
      "Epoch 283/500\n",
      " - 0s - loss: 0.0054 - val_loss: 0.0060\n",
      "Epoch 284/500\n",
      " - 0s - loss: 0.0054 - val_loss: 0.0060\n",
      "Epoch 285/500\n",
      " - 0s - loss: 0.0054 - val_loss: 0.0060\n",
      "Epoch 286/500\n",
      " - 0s - loss: 0.0054 - val_loss: 0.0060\n",
      "Epoch 287/500\n",
      " - 0s - loss: 0.0054 - val_loss: 0.0060\n",
      "Epoch 288/500\n",
      " - 0s - loss: 0.0054 - val_loss: 0.0060\n",
      "Epoch 289/500\n",
      " - 0s - loss: 0.0054 - val_loss: 0.0060\n",
      "Epoch 290/500\n",
      " - 0s - loss: 0.0054 - val_loss: 0.0060\n",
      "Epoch 291/500\n",
      " - 0s - loss: 0.0054 - val_loss: 0.0060\n",
      "Epoch 292/500\n",
      " - 0s - loss: 0.0054 - val_loss: 0.0060\n",
      "Epoch 293/500\n",
      " - 0s - loss: 0.0054 - val_loss: 0.0060\n",
      "Epoch 294/500\n",
      " - 0s - loss: 0.0054 - val_loss: 0.0060\n",
      "Epoch 295/500\n",
      " - 0s - loss: 0.0054 - val_loss: 0.0060\n",
      "Epoch 296/500\n",
      " - 0s - loss: 0.0054 - val_loss: 0.0060\n",
      "Epoch 297/500\n",
      " - 0s - loss: 0.0054 - val_loss: 0.0060\n",
      "Epoch 298/500\n",
      " - 0s - loss: 0.0054 - val_loss: 0.0060\n",
      "Epoch 299/500\n",
      " - 0s - loss: 0.0054 - val_loss: 0.0060\n",
      "Epoch 300/500\n",
      " - 0s - loss: 0.0054 - val_loss: 0.0060\n",
      "Epoch 301/500\n",
      " - 0s - loss: 0.0054 - val_loss: 0.0060\n",
      "Epoch 302/500\n",
      " - 0s - loss: 0.0054 - val_loss: 0.0060\n",
      "Epoch 303/500\n",
      " - 0s - loss: 0.0054 - val_loss: 0.0060\n",
      "Epoch 304/500\n",
      " - 0s - loss: 0.0054 - val_loss: 0.0060\n",
      "Epoch 305/500\n",
      " - 0s - loss: 0.0054 - val_loss: 0.0060\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Epoch 306/500\n",
      " - 0s - loss: 0.0054 - val_loss: 0.0060\n",
      "Epoch 307/500\n",
      " - 0s - loss: 0.0054 - val_loss: 0.0060\n",
      "Epoch 308/500\n",
      " - 0s - loss: 0.0054 - val_loss: 0.0060\n",
      "Epoch 309/500\n",
      " - 0s - loss: 0.0054 - val_loss: 0.0060\n",
      "Epoch 310/500\n",
      " - 0s - loss: 0.0054 - val_loss: 0.0060\n",
      "Epoch 311/500\n",
      " - 0s - loss: 0.0054 - val_loss: 0.0060\n",
      "Epoch 312/500\n",
      " - 0s - loss: 0.0054 - val_loss: 0.0060\n",
      "Epoch 313/500\n",
      " - 0s - loss: 0.0054 - val_loss: 0.0060\n",
      "Epoch 314/500\n",
      " - 0s - loss: 0.0054 - val_loss: 0.0060\n",
      "Epoch 315/500\n",
      " - 0s - loss: 0.0054 - val_loss: 0.0060\n",
      "Epoch 316/500\n",
      " - 0s - loss: 0.0054 - val_loss: 0.0060\n",
      "Epoch 317/500\n",
      " - 0s - loss: 0.0054 - val_loss: 0.0060\n",
      "Epoch 318/500\n",
      " - 0s - loss: 0.0054 - val_loss: 0.0060\n",
      "Epoch 319/500\n",
      " - 0s - loss: 0.0054 - val_loss: 0.0060\n",
      "Epoch 320/500\n",
      " - 0s - loss: 0.0054 - val_loss: 0.0060\n",
      "Epoch 321/500\n",
      " - 0s - loss: 0.0054 - val_loss: 0.0060\n",
      "Epoch 322/500\n",
      " - 0s - loss: 0.0054 - val_loss: 0.0060\n",
      "Epoch 323/500\n",
      " - 0s - loss: 0.0054 - val_loss: 0.0060\n",
      "Epoch 324/500\n",
      " - 0s - loss: 0.0054 - val_loss: 0.0060\n",
      "Epoch 325/500\n",
      " - 0s - loss: 0.0054 - val_loss: 0.0060\n",
      "Epoch 326/500\n",
      " - 0s - loss: 0.0054 - val_loss: 0.0060\n",
      "Epoch 327/500\n",
      " - 0s - loss: 0.0054 - val_loss: 0.0060\n",
      "Epoch 328/500\n",
      " - 0s - loss: 0.0054 - val_loss: 0.0060\n",
      "Epoch 329/500\n",
      " - 0s - loss: 0.0054 - val_loss: 0.0060\n",
      "Epoch 330/500\n",
      " - 0s - loss: 0.0054 - val_loss: 0.0060\n",
      "Epoch 331/500\n",
      " - 0s - loss: 0.0054 - val_loss: 0.0060\n",
      "Epoch 332/500\n",
      " - 0s - loss: 0.0054 - val_loss: 0.0060\n",
      "Epoch 333/500\n",
      " - 0s - loss: 0.0054 - val_loss: 0.0060\n",
      "Epoch 334/500\n",
      " - 0s - loss: 0.0054 - val_loss: 0.0060\n",
      "Epoch 335/500\n",
      " - 0s - loss: 0.0054 - val_loss: 0.0060\n",
      "Epoch 336/500\n",
      " - 0s - loss: 0.0054 - val_loss: 0.0060\n",
      "Epoch 337/500\n",
      " - 0s - loss: 0.0054 - val_loss: 0.0060\n",
      "Epoch 338/500\n",
      " - 0s - loss: 0.0054 - val_loss: 0.0060\n",
      "Epoch 339/500\n",
      " - 0s - loss: 0.0054 - val_loss: 0.0060\n",
      "Epoch 340/500\n",
      " - 0s - loss: 0.0054 - val_loss: 0.0060\n",
      "Epoch 341/500\n",
      " - 0s - loss: 0.0054 - val_loss: 0.0060\n",
      "Epoch 342/500\n",
      " - 0s - loss: 0.0054 - val_loss: 0.0060\n",
      "Epoch 343/500\n",
      " - 0s - loss: 0.0054 - val_loss: 0.0060\n",
      "Epoch 344/500\n",
      " - 0s - loss: 0.0054 - val_loss: 0.0060\n",
      "Epoch 345/500\n",
      " - 0s - loss: 0.0054 - val_loss: 0.0060\n",
      "Epoch 346/500\n",
      " - 0s - loss: 0.0054 - val_loss: 0.0060\n",
      "Epoch 347/500\n",
      " - 0s - loss: 0.0054 - val_loss: 0.0060\n",
      "Epoch 348/500\n",
      " - 0s - loss: 0.0054 - val_loss: 0.0060\n",
      "Epoch 349/500\n",
      " - 0s - loss: 0.0054 - val_loss: 0.0060\n",
      "Epoch 350/500\n",
      " - 0s - loss: 0.0054 - val_loss: 0.0060\n",
      "Epoch 351/500\n",
      " - 0s - loss: 0.0054 - val_loss: 0.0060\n",
      "Epoch 352/500\n",
      " - 0s - loss: 0.0054 - val_loss: 0.0060\n",
      "Epoch 353/500\n",
      " - 0s - loss: 0.0054 - val_loss: 0.0060\n",
      "Epoch 354/500\n",
      " - 0s - loss: 0.0054 - val_loss: 0.0060\n",
      "Epoch 355/500\n",
      " - 0s - loss: 0.0054 - val_loss: 0.0060\n",
      "Epoch 356/500\n",
      " - 0s - loss: 0.0054 - val_loss: 0.0060\n",
      "Epoch 357/500\n",
      " - 0s - loss: 0.0054 - val_loss: 0.0060\n",
      "Epoch 358/500\n",
      " - 0s - loss: 0.0054 - val_loss: 0.0060\n",
      "Epoch 359/500\n",
      " - 0s - loss: 0.0054 - val_loss: 0.0060\n",
      "Epoch 360/500\n",
      " - 0s - loss: 0.0054 - val_loss: 0.0060\n",
      "Epoch 361/500\n",
      " - 0s - loss: 0.0054 - val_loss: 0.0060\n",
      "Epoch 362/500\n",
      " - 0s - loss: 0.0054 - val_loss: 0.0060\n",
      "Epoch 363/500\n",
      " - 0s - loss: 0.0054 - val_loss: 0.0060\n",
      "Epoch 364/500\n",
      " - 0s - loss: 0.0054 - val_loss: 0.0060\n",
      "Epoch 365/500\n",
      " - 0s - loss: 0.0054 - val_loss: 0.0060\n",
      "Epoch 366/500\n",
      " - 0s - loss: 0.0054 - val_loss: 0.0060\n",
      "Epoch 367/500\n",
      " - 0s - loss: 0.0054 - val_loss: 0.0060\n",
      "Epoch 368/500\n",
      " - 0s - loss: 0.0054 - val_loss: 0.0060\n",
      "Epoch 369/500\n",
      " - 0s - loss: 0.0054 - val_loss: 0.0060\n",
      "Epoch 370/500\n",
      " - 0s - loss: 0.0054 - val_loss: 0.0060\n",
      "Epoch 371/500\n",
      " - 0s - loss: 0.0054 - val_loss: 0.0060\n",
      "Epoch 372/500\n",
      " - 0s - loss: 0.0054 - val_loss: 0.0060\n",
      "Epoch 373/500\n",
      " - 0s - loss: 0.0054 - val_loss: 0.0060\n",
      "Epoch 374/500\n",
      " - 0s - loss: 0.0054 - val_loss: 0.0060\n",
      "Epoch 375/500\n",
      " - 0s - loss: 0.0054 - val_loss: 0.0060\n",
      "Epoch 376/500\n",
      " - 0s - loss: 0.0054 - val_loss: 0.0060\n",
      "Epoch 377/500\n",
      " - 0s - loss: 0.0054 - val_loss: 0.0060\n",
      "Epoch 378/500\n",
      " - 0s - loss: 0.0054 - val_loss: 0.0060\n",
      "Epoch 379/500\n",
      " - 0s - loss: 0.0054 - val_loss: 0.0060\n",
      "Epoch 380/500\n",
      " - 0s - loss: 0.0054 - val_loss: 0.0060\n",
      "Epoch 381/500\n",
      " - 0s - loss: 0.0054 - val_loss: 0.0060\n",
      "Epoch 382/500\n",
      " - 0s - loss: 0.0054 - val_loss: 0.0060\n",
      "Epoch 383/500\n",
      " - 0s - loss: 0.0054 - val_loss: 0.0060\n",
      "Epoch 384/500\n",
      " - 0s - loss: 0.0054 - val_loss: 0.0060\n",
      "Epoch 385/500\n",
      " - 0s - loss: 0.0054 - val_loss: 0.0060\n",
      "Epoch 386/500\n",
      " - 0s - loss: 0.0054 - val_loss: 0.0060\n",
      "Epoch 387/500\n",
      " - 0s - loss: 0.0054 - val_loss: 0.0060\n",
      "Epoch 388/500\n",
      " - 0s - loss: 0.0054 - val_loss: 0.0060\n",
      "Epoch 389/500\n",
      " - 0s - loss: 0.0054 - val_loss: 0.0060\n",
      "Epoch 390/500\n",
      " - 0s - loss: 0.0054 - val_loss: 0.0060\n",
      "Epoch 391/500\n",
      " - 0s - loss: 0.0054 - val_loss: 0.0060\n",
      "Epoch 392/500\n",
      " - 0s - loss: 0.0054 - val_loss: 0.0060\n",
      "Epoch 393/500\n",
      " - 0s - loss: 0.0054 - val_loss: 0.0060\n",
      "Epoch 394/500\n",
      " - 0s - loss: 0.0054 - val_loss: 0.0060\n",
      "Epoch 395/500\n",
      " - 0s - loss: 0.0054 - val_loss: 0.0060\n",
      "Epoch 396/500\n",
      " - 0s - loss: 0.0054 - val_loss: 0.0060\n",
      "Epoch 397/500\n",
      " - 0s - loss: 0.0054 - val_loss: 0.0060\n",
      "Epoch 398/500\n",
      " - 0s - loss: 0.0054 - val_loss: 0.0060\n",
      "Epoch 399/500\n",
      " - 0s - loss: 0.0054 - val_loss: 0.0060\n",
      "Epoch 400/500\n",
      " - 0s - loss: 0.0054 - val_loss: 0.0060\n",
      "Epoch 401/500\n",
      " - 0s - loss: 0.0054 - val_loss: 0.0060\n",
      "Epoch 402/500\n",
      " - 0s - loss: 0.0054 - val_loss: 0.0060\n",
      "Epoch 403/500\n",
      " - 0s - loss: 0.0054 - val_loss: 0.0060\n",
      "Epoch 404/500\n",
      " - 0s - loss: 0.0054 - val_loss: 0.0060\n",
      "Epoch 405/500\n",
      " - 0s - loss: 0.0054 - val_loss: 0.0060\n",
      "Epoch 406/500\n",
      " - 0s - loss: 0.0054 - val_loss: 0.0060\n",
      "Epoch 407/500\n",
      " - 0s - loss: 0.0054 - val_loss: 0.0060\n",
      "Epoch 408/500\n",
      " - 0s - loss: 0.0054 - val_loss: 0.0060\n",
      "Epoch 409/500\n",
      " - 0s - loss: 0.0054 - val_loss: 0.0060\n",
      "Epoch 410/500\n",
      " - 0s - loss: 0.0054 - val_loss: 0.0060\n",
      "Epoch 411/500\n",
      " - 0s - loss: 0.0054 - val_loss: 0.0060\n",
      "Epoch 412/500\n",
      " - 0s - loss: 0.0054 - val_loss: 0.0060\n",
      "Epoch 413/500\n",
      " - 0s - loss: 0.0054 - val_loss: 0.0060\n",
      "Epoch 414/500\n",
      " - 0s - loss: 0.0054 - val_loss: 0.0060\n",
      "Epoch 415/500\n",
      " - 0s - loss: 0.0054 - val_loss: 0.0060\n",
      "Epoch 416/500\n",
      " - 0s - loss: 0.0054 - val_loss: 0.0060\n",
      "Epoch 417/500\n",
      " - 0s - loss: 0.0054 - val_loss: 0.0060\n",
      "Epoch 418/500\n",
      " - 0s - loss: 0.0054 - val_loss: 0.0060\n",
      "Epoch 419/500\n",
      " - 0s - loss: 0.0054 - val_loss: 0.0060\n",
      "Epoch 420/500\n",
      " - 0s - loss: 0.0054 - val_loss: 0.0060\n",
      "Epoch 421/500\n",
      " - 0s - loss: 0.0054 - val_loss: 0.0060\n",
      "Epoch 422/500\n",
      " - 0s - loss: 0.0054 - val_loss: 0.0060\n",
      "Epoch 423/500\n",
      " - 0s - loss: 0.0054 - val_loss: 0.0060\n",
      "Epoch 424/500\n",
      " - 0s - loss: 0.0054 - val_loss: 0.0060\n",
      "Epoch 425/500\n",
      " - 0s - loss: 0.0054 - val_loss: 0.0060\n",
      "Epoch 426/500\n",
      " - 0s - loss: 0.0054 - val_loss: 0.0060\n",
      "Epoch 427/500\n",
      " - 0s - loss: 0.0054 - val_loss: 0.0060\n",
      "Epoch 428/500\n",
      " - 0s - loss: 0.0054 - val_loss: 0.0060\n",
      "Epoch 429/500\n",
      " - 0s - loss: 0.0054 - val_loss: 0.0060\n",
      "Epoch 430/500\n",
      " - 0s - loss: 0.0054 - val_loss: 0.0060\n",
      "Epoch 431/500\n",
      " - 0s - loss: 0.0054 - val_loss: 0.0060\n",
      "Epoch 432/500\n",
      " - 0s - loss: 0.0054 - val_loss: 0.0060\n",
      "Epoch 433/500\n",
      " - 0s - loss: 0.0054 - val_loss: 0.0060\n",
      "Epoch 434/500\n",
      " - 0s - loss: 0.0054 - val_loss: 0.0060\n",
      "Epoch 435/500\n",
      " - 0s - loss: 0.0054 - val_loss: 0.0060\n",
      "Epoch 436/500\n",
      " - 0s - loss: 0.0054 - val_loss: 0.0060\n",
      "Epoch 437/500\n",
      " - 0s - loss: 0.0054 - val_loss: 0.0060\n",
      "Epoch 438/500\n",
      " - 0s - loss: 0.0054 - val_loss: 0.0060\n",
      "Epoch 439/500\n",
      " - 0s - loss: 0.0054 - val_loss: 0.0060\n",
      "Epoch 440/500\n",
      " - 0s - loss: 0.0054 - val_loss: 0.0060\n",
      "Epoch 441/500\n",
      " - 0s - loss: 0.0054 - val_loss: 0.0060\n",
      "Epoch 442/500\n",
      " - 0s - loss: 0.0054 - val_loss: 0.0060\n",
      "Epoch 443/500\n",
      " - 0s - loss: 0.0054 - val_loss: 0.0060\n",
      "Epoch 444/500\n",
      " - 0s - loss: 0.0054 - val_loss: 0.0060\n",
      "Epoch 445/500\n",
      " - 0s - loss: 0.0054 - val_loss: 0.0060\n",
      "Epoch 446/500\n",
      " - 0s - loss: 0.0054 - val_loss: 0.0060\n",
      "Epoch 447/500\n",
      " - 0s - loss: 0.0054 - val_loss: 0.0060\n",
      "Epoch 448/500\n",
      " - 0s - loss: 0.0054 - val_loss: 0.0060\n",
      "Epoch 449/500\n",
      " - 0s - loss: 0.0054 - val_loss: 0.0060\n",
      "Epoch 450/500\n",
      " - 0s - loss: 0.0054 - val_loss: 0.0060\n",
      "Epoch 451/500\n",
      " - 0s - loss: 0.0054 - val_loss: 0.0060\n",
      "Epoch 452/500\n",
      " - 0s - loss: 0.0054 - val_loss: 0.0060\n",
      "Epoch 453/500\n",
      " - 0s - loss: 0.0054 - val_loss: 0.0060\n",
      "Epoch 454/500\n",
      " - 0s - loss: 0.0054 - val_loss: 0.0060\n",
      "Epoch 455/500\n",
      " - 0s - loss: 0.0054 - val_loss: 0.0060\n",
      "Epoch 456/500\n",
      " - 0s - loss: 0.0054 - val_loss: 0.0060\n",
      "Epoch 457/500\n",
      " - 0s - loss: 0.0054 - val_loss: 0.0060\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Epoch 458/500\n",
      " - 0s - loss: 0.0054 - val_loss: 0.0060\n",
      "Epoch 459/500\n",
      " - 0s - loss: 0.0054 - val_loss: 0.0060\n",
      "Epoch 460/500\n",
      " - 0s - loss: 0.0054 - val_loss: 0.0060\n",
      "Epoch 461/500\n",
      " - 0s - loss: 0.0054 - val_loss: 0.0060\n",
      "Epoch 462/500\n",
      " - 0s - loss: 0.0054 - val_loss: 0.0060\n",
      "Epoch 463/500\n",
      " - 0s - loss: 0.0054 - val_loss: 0.0060\n",
      "Epoch 464/500\n",
      " - 0s - loss: 0.0054 - val_loss: 0.0060\n",
      "Epoch 465/500\n",
      " - 0s - loss: 0.0054 - val_loss: 0.0060\n",
      "Epoch 466/500\n",
      " - 0s - loss: 0.0054 - val_loss: 0.0060\n",
      "Epoch 467/500\n",
      " - 0s - loss: 0.0054 - val_loss: 0.0060\n",
      "Epoch 468/500\n",
      " - 0s - loss: 0.0054 - val_loss: 0.0060\n",
      "Epoch 469/500\n",
      " - 0s - loss: 0.0054 - val_loss: 0.0060\n",
      "Epoch 470/500\n",
      " - 0s - loss: 0.0054 - val_loss: 0.0060\n",
      "Epoch 471/500\n",
      " - 0s - loss: 0.0054 - val_loss: 0.0060\n",
      "Epoch 472/500\n",
      " - 0s - loss: 0.0054 - val_loss: 0.0060\n",
      "Epoch 473/500\n",
      " - 0s - loss: 0.0054 - val_loss: 0.0060\n",
      "Epoch 474/500\n",
      " - 0s - loss: 0.0054 - val_loss: 0.0060\n",
      "Epoch 475/500\n",
      " - 0s - loss: 0.0054 - val_loss: 0.0060\n",
      "Epoch 476/500\n",
      " - 0s - loss: 0.0054 - val_loss: 0.0060\n",
      "Epoch 477/500\n",
      " - 0s - loss: 0.0054 - val_loss: 0.0060\n",
      "Epoch 478/500\n",
      " - 0s - loss: 0.0054 - val_loss: 0.0060\n",
      "Epoch 479/500\n",
      " - 0s - loss: 0.0054 - val_loss: 0.0060\n",
      "Epoch 480/500\n",
      " - 0s - loss: 0.0054 - val_loss: 0.0060\n",
      "Epoch 481/500\n",
      " - 0s - loss: 0.0054 - val_loss: 0.0060\n",
      "Epoch 482/500\n",
      " - 0s - loss: 0.0054 - val_loss: 0.0060\n",
      "Epoch 483/500\n",
      " - 0s - loss: 0.0054 - val_loss: 0.0060\n",
      "Epoch 484/500\n",
      " - 0s - loss: 0.0054 - val_loss: 0.0060\n",
      "Epoch 485/500\n",
      " - 0s - loss: 0.0054 - val_loss: 0.0060\n",
      "Epoch 486/500\n",
      " - 0s - loss: 0.0054 - val_loss: 0.0060\n",
      "Epoch 487/500\n",
      " - 0s - loss: 0.0054 - val_loss: 0.0060\n",
      "Epoch 488/500\n",
      " - 0s - loss: 0.0054 - val_loss: 0.0060\n",
      "Epoch 489/500\n",
      " - 0s - loss: 0.0054 - val_loss: 0.0060\n",
      "Epoch 490/500\n",
      " - 0s - loss: 0.0054 - val_loss: 0.0060\n",
      "Epoch 491/500\n",
      " - 0s - loss: 0.0054 - val_loss: 0.0060\n",
      "Epoch 492/500\n",
      " - 0s - loss: 0.0054 - val_loss: 0.0060\n",
      "Epoch 493/500\n",
      " - 0s - loss: 0.0054 - val_loss: 0.0060\n",
      "Epoch 494/500\n",
      " - 0s - loss: 0.0054 - val_loss: 0.0060\n",
      "Epoch 495/500\n",
      " - 0s - loss: 0.0054 - val_loss: 0.0060\n",
      "Epoch 496/500\n",
      " - 0s - loss: 0.0054 - val_loss: 0.0060\n",
      "Epoch 497/500\n",
      " - 0s - loss: 0.0054 - val_loss: 0.0060\n",
      "Epoch 498/500\n",
      " - 0s - loss: 0.0054 - val_loss: 0.0060\n",
      "Epoch 499/500\n",
      " - 0s - loss: 0.0054 - val_loss: 0.0060\n",
      "Epoch 500/500\n",
      " - 0s - loss: 0.0054 - val_loss: 0.0060\n"
     ]
    }
   ],
   "source": [
    "# Get the training data and trained LSTM\n",
    "LSTM_Train = get_input_data(pd.read_csv('Residuals_for_LSTM_Training.csv'))\n",
    "conv_data = convert_input_structure(800, LSTM_Train) \n",
    "Trained_LSTM = build_LSTM_structure(conv_data)\n",
    "\n",
    "# Plot the validation loss function\n",
    "# plt.plot(Trained_LSTM[1].history['val_loss'])\n",
    "# To store the result\n",
    "# pd.DataFrame(history.history['val_loss']).to_csv('yellow_valid.csv')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "validation: 0.0776911011250218 and Test: 0.1503971953009562\n",
      "r-squared: 0.37283509155684247\n"
     ]
    }
   ],
   "source": [
    "# Create the data structure for the test data\n",
    "# Load Test Data\n",
    "LSTM_Test = get_input_data(pd.read_csv('Residuals_for_LSTM_Test.csv'))\n",
    "conv_test = convert_test_structure(LSTM_Test)\n",
    "\n",
    "# Check the train and validation result\n",
    "y_hat_train = Trained_LSTM[0].predict(conv_data[0])\n",
    "y_hat_valid = Trained_LSTM[0].predict(conv_data[2])\n",
    "\n",
    "# Predict the test data\n",
    "y_hat = Trained_LSTM[0].predict(conv_test[0])\n",
    "\n",
    "# RMSE Test\n",
    "from math import sqrt\n",
    "RMSE_valid = sqrt(mean_squared_error(y_hat_valid, conv_data[3]))\n",
    "RMSE_test = sqrt(mean_squared_error(y_hat, conv_test[1]))\n",
    "print(\"validation:\", RMSE_valid, \"and\", \"Test:\",RMSE_test)\n",
    "\n",
    "# Derive the r-square value\n",
    "from sklearn.metrics import r2_score\n",
    "print(\"r-squared:\", r2_score(conv_test[1], y_hat))\n",
    "\n",
    "# plt.plot(y_hat)\n",
    "# plt.plot(conv_test[1])\n",
    "\n",
    "# To store the test and the predicted results\n",
    "pd.DataFrame(y_hat_train).to_csv('Train_Results_yellow_taxi.csv')\n",
    "pd.DataFrame(y_hat_valid).to_csv('Valid_Results_yellow_taxi.csv')\n",
    "\n",
    "pd.DataFrame(conv_data[1]).to_csv('Train_test_yellow_taxi.csv')\n",
    "pd.DataFrame(conv_data[3]).to_csv('Valid_test_yellow_taxi.csv')\n",
    "\n",
    "pd.DataFrame(y_hat).to_csv('Residual_Results_yellow_taxi.csv')\n",
    "pd.DataFrame(conv_test[1]).to_csv('Residual_test_yellow_taxi.csv')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 19,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "[<matplotlib.lines.Line2D at 0x16ea4307ac8>]"
      ]
     },
     "execution_count": 19,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "plt.plot(y_hat)\n",
    "plt.plot(conv_test[1])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "pd.DataFrame(y_hat).to_csv('Residual_Results_yellow_taxi.csv')\n",
    "pd.DataFrame(conv_test[1]).to_csv('Residual_test_yellow_taxi.csv')"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.6.10"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
